package com.hmdp.controller;


import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.service.IShopTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

import static com.hmdp.utils.RedisConstants.SHOP_TYPE_KEY;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Slf4j
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
    @Resource
    private IShopTypeService typeService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 基于Redis查询所有商铺类型
     * @return 商铺类型列表
     */
    @GetMapping("list")
    public Result queryTypeList() {
        //设置所有商品信息的key
        String Key= SHOP_TYPE_KEY;

        //1、在Redis中查询所有的商铺类型======什么样的格式存进去取出来时就要转为什么类型的*********
        String stringShop = stringRedisTemplate.opsForValue().get(Key);

        log.info("查询所有商品信息{}",stringShop);
        //2、判断Redis中是否存在
        //3、存在，则直接返回
        if (stringShop != null) {
//            return Result.ok(stringShop);
            // 或者反序列化为对象返回（需保持格式一致）：======什么样的格式存进去取出来时就要转为什么类型的*********
             List<ShopType> typeList = JSONUtil.toList(stringShop, ShopType.class);
             return Result.ok(typeList);
        }

        //4、不存在，则从数据库中查询
        List<ShopType> typeList = typeService
                .query().orderByAsc("sort").list();

        //5、判断数据库中存在
        //6、不存在，则返回错误404
        if (typeList == null) {
            return Result.fail("店铺不存在");
        }

        //7、存在，则使用循环写入Redis======什么样的格式存进去取出来时就要转为什么类型的*********
        stringRedisTemplate.opsForValue().set(Key, JSONUtil.toJsonStr(typeList));

        // 8返回
        return Result.ok(typeList);
    }
}
